package dongtaidaili;


//注意，基于接口的代理方式，被代理对象至少要实现一个接口！

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy; //Proxy 提供用于创建动态代理类和实例的静态方法，它还是由这些方法创建的所有动态代理类的超类

public class Test {
    public static void main(String[] args) {
        //这里注意不是final类型在下面将不能被内部类引用

        //Class.forName("dongtaidaili.MyActor")
        final MyActor actor = new MyActor();
        //这就是在创建代理对象，第一个参数类加载器；第二个参数被代理对象实现的接口，好告知代理对象它需要具备哪些行为；第三个参数就是我们进行增强的代码
        IActor proxyActor = (IActor) Proxy.newProxyInstance(actor.getClass().getClassLoader(),
                actor.getClass().getInterfaces(), new InvocationHandler() {

            @Override
            //proxy代表代理对象，method表示执行的方法对象，args表示参数数组。被代理对象每个方法执行时都会过这个invoke方法
            public Object invoke(Object proxy, Method method, Object[] args)
                    throws Throwable {
                int money = (int) args[0];
                if("perform".equals(method.getName())){
                    if(money>10000)
                        method.invoke(actor, args);
                }else if("dangerPerform".equals(method.getName())){
                    if(money>50000)
                        method.invoke(actor, args);
                }
                return null;
            }
        });

        proxyActor.perform(10001, "hahaha");
        proxyActor.dangerPerform(50001);
    }


}
